#ifndef TYPES_H
#define TYPES_H

#include <QObject>
#include <QString>
#include <QList>
#include <QMap>
#include <QVariantMap>
#include "enums.h"

// ==================== 命令优先级枚举 ====================
enum class CommandPriority {
    Normal = 0,     // 普通命令（用户发起的）
    High = 1,       // 高优先级命令（响应性命令，如数据应答）
    Immediate = 2   // 立即执行命令（紧急命令）
};

// ==================== 任务队列相关结构 ====================
struct DeviceCommandTask {
    DeviceProtocol::IPCCommand command;
    QVariantMap params;
    // 移除 response 指针成员
    qint64 timestamp;
    int retryCount;
    bool completed;
    QString qn;
    CommandPriority priority;

    DeviceCommandTask(DeviceProtocol::IPCCommand cmd = DeviceProtocol::IPCCommand::DeviceInitialize,
                      const QVariantMap &p = QVariantMap(),
                      CommandPriority prio = CommandPriority::Normal)
        : command(cmd), params(p), timestamp(0),
        retryCount(0), completed(false), priority(prio) {}
};

// ==================== 数据结构定义 ====================
struct PendingRequest {
    QString qn;
    QByteArray data;
    int retryCount;
    qint64 expireTime;
    int maxRetries;
    DeviceProtocol::IPCCommand command;

    bool hasQnRtn;          // 是否收到请求应答
    bool hasExeRtn;         // 是否收到执行结果
    bool hasDataResponse;   // 是否收到数据响应
    QVariantMap responseData; // 最终响应数据
    bool completed;         // 请求是否完成

    PendingRequest() : retryCount(0), expireTime(0), maxRetries(3),
        command(DeviceProtocol::IPCCommand::DeviceInitialize),
        hasQnRtn(false), hasExeRtn(false), hasDataResponse(false), completed(false) {}
};

struct PacketCache {
    QString qn;
    QString crc;
    qint64 timestamp;
};

// 工艺参数
struct ProcessParams {
    // 原有参数
    double toolDiameter;    // D - 刀具直径 (mm)
    double toolSpeed;       // R - 刀具转速 (rpm)
    double lineSpacing;     // S - 行刀间距 (mm)
    double cuttingDepth;    // H - 吃刀深度 (mm)
    double feedRate;        // V - 进给速度 (mm/min)

    // 新增参数
    double workpieceSurfaceHeight; // 工件表面高度 (mm)
    double totalCuttingDepth;      // 切削总深 (mm)
    double stepDistance;           // 步动距离 (mm)
    double rapidSpeed;             // FV - 空跑速度 (mm/min)
    double jogSpeed;               // 点动速度 (mm/min)

    ProcessParams() :
        toolDiameter(0), toolSpeed(0), lineSpacing(0),
        cuttingDepth(0), feedRate(0), workpieceSurfaceHeight(0),
        totalCuttingDepth(0), stepDistance(0), rapidSpeed(0),
        jogSpeed(0) {}
};

#endif // TYPES_H
